package com.nx.sync;

public class TestNxLock {

    int  i=0;

    public static void main(String[] args) {
        new TestNxLock().task();

    }

    public void task(){
        Thread t1=new Thread(()->{
            add();
        },"t1");

        Thread t2=new Thread(()->{
            add();
        },"t2");

        Thread t3=new Thread(()->{
            add();
        },"t3");

        t1.start();
        t2.start();
        t3.start();

        /**
         *
         * join 是串行,加锁也是 串行 。
         *   加锁是为了部分的串行。
         *
         *   sychronized  锁的是对象，还是代码块
         *      锁的本质,
         *
         *
         *      reentrantLock:
         *        lock 他就是改变一个对象当中的值
         *        改变的过程叫上锁,所以叫做锁对象。
         *
         *
         *  锁必须是全局变量,局部变量不行
         *     定义为局部变量,JVM 开启锁的优化,会去锁。
         *
         *     锁消除（30分钟）
         *     sync 优化，锁粗化
         *
         *
         *     jol 看到对象头的信息。
         */
        try {
            t1.join();
            t2.join();
            t3.join();
            System.out.println(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public void add(){
        for (int j = 0; j <= 9999; j++) {
            int temp=i;
            temp++;
            i=temp;
        }
    }

}
